#ifndef __XML_H__
#define __XML_H__

#include <iostream>
using namespace std;
#include <string>
#include <map>
#include <list>

namespace sf
{
    namespace xml
    {
        class Value
        {
        public:
            Value();
            Value(bool value);
            Value(int value);
            Value(double value);
            Value(const char *value);
            Value(const string &value);
            ~Value();

            Value &operator=(bool value);
            Value &operator=(int value);
            Value &operator=(double value);
            Value &operator=(const char *value);
            Value &operator=(const string &value);
            Value &operator=(const Value &value);

            bool operator==(const Value &other);
            bool operator!=(const Value &other);

            operator bool();
            operator int();
            operator double();
            operator string();

        private:
            string m_value;
        };

        class Xml
        {
        public:
            Xml();
            Xml(const char *name);
            Xml(const string &name);
            Xml(const Xml &other);
            ~Xml();

            string name() const;
            void name(const string &name);

            string text() const;
            void text(const string &text);

            Value &attr(const string &key);
            void attr(const string &key, const Value &val);

            // 添加子节点
            void append(const Xml &child);
            Xml &operator[](int index);

            // 通过节点的名称来获取 子节点
            Xml &operator[](const char *name);
            Xml &operator[](const string &name);
            // 赋值
            Xml &operator=(const Xml &other);

            // 删除子节点
            void remove(int index);
            void remove(const char *name);
            void remove(const string &name);

            string str() const; // 序列化
            void clear();       // 释放内纯

            typedef std::list<Xml>::iterator iterator;
            inline iterator begin()
            {
                return m_child->begin();
            }
            inline iterator end()
            {
                return m_child->end();
            }
            inline iterator erase(iterator it)
            {
                it->clear();
                return m_child->erase(it);
            }
            inline int size() const
            {
                return m_child->size();
            }

            bool load(const string &filename);
            bool save(const string &filename);
            bool parse(const string &str);

        private:
            string *m_name;                   // 节点名
            string *m_text;                   // 节点内容
            std::map<string, Value> *m_attrs; // 节点属性
            std::list<Xml> *m_child;          // 子节点
        };

    }
}

#endif